#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//动态内存管理
//void* malloc(size_t size),开辟size个字节的内存块,返回内存块的起始空间,开辟失败返回空指针
//void* calloc(size_t num, size_t size),num是元素大小,size是每个元素的大小,开辟空间时,会将空间初始化
//void* realloc(void* ptr, size_t size)
//调整动态开辟的空间，ptr是要调整的空间，size是调整后改空间的大小
//当原空间后面的空间不够扩容时，函数会另找一块大小为size的空间，并将原本的数据拷贝到这个空间中，free掉原本的空间
//当空间够时，直接在原空间后追加
//当第一个参数为空指针时，realloc的功能与malloc一样
//free

void test1()
{
    int arr[10] = {0};//栈区空间
    //动态内存开辟
    int*p = (int*)malloc(40);//堆区空间
    if(p == NULL)
    {
        printf("%s\n", strerror(errno));
        exit(-1);
    }
    //使用
    int i = 0;
    for(i = 0; i < 10; i++)
    {
        *(p+i) = i;
    }

    for(i = 0; i < 10; i++)
    {
        printf("%d ", p[i]);
    }
    //释放内存空间
    free(p);
    //栈区空间不可free
    p = NULL;
    //没有free，并不是说内存空间不回收了
    //当程序退出时，系统会自动回收内存空间
}

void test2()
{
    int* p = (int*)calloc(10, sizeof(int));
    if(p == NULL)
    {
        printf("%s\n", strerror(errno));
        exit(-1);
    }
    int i = 0;
    for(i = 0; i < 10; i++)
    {
        printf("%d ", *(p + i));
    }

    free(p);
    p = NULL;
}

void test3()
{
    int*p = (int*)malloc(40);//堆区空间
    if(p == NULL)
    {
        printf("%s\n", strerror(errno));
        exit(-1);
    }
    int i = 0;
    for(i = 0; i < 10; i++)
    {
        *(p+i) = i + 1;
    }

    int* ptr = (int*)realloc(p, 80);
    if(ptr != NULL)
    {
        p = ptr;
    }
    free(p);
}

int main()
{
    //test1();
    test2();
    return 0;
}